package ejb;

import interfaces.Facade;
import interfaces.TagsXML;

import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.util.List;

import javax.ejb.ActivationConfigProperty;
import javax.ejb.EJB;
import javax.ejb.EJBException;
import javax.ejb.MessageDriven;
import javax.ejb.MessageDrivenBean;
import javax.ejb.MessageDrivenContext;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.InitialContext;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;

import utils.NamingUtil;
import entitys.Cliente;
import entitys.ItemSolicitudCompra;
import entitys.Rodamiento;
import entitys.SolicitudCompra;

@MessageDriven(
		activationConfig = { @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
							 @ActivationConfigProperty(propertyName="destination",propertyValue="queue/colaSolCom")})
public class RecibirSolicitudCompraBean implements MessageDrivenBean,MessageListener {
	@PersistenceContext(unitName = "OficinaVentas")
	private EntityManager manager;

    public RecibirSolicitudCompraBean() {
        // TODO Auto-generated constructor stub
    }

    public void onMessage(Message message) {
		TextMessage msg = null;
		try {
			if (message instanceof TextMessage) {
				msg = (TextMessage)message;
				procesarXML(msg.getText());
			} else {
				System.out.println("Error en el mensaje recibido");
			}
				
		} catch (JMSException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
    }
    
    private void procesarXML(String xmlSolCom){
    	SolicitudCompra oSolCom = getSolicitudCompra(xmlSolCom);
    	manager.persist(oSolCom);
    	manager.flush();
    	comprarRodamientos(getXMLOrdenCompra(oSolCom));
    }
    
    private SolicitudCompra getSolicitudCompra(String xml){
    	SolicitudCompra oSolCom = new SolicitudCompra();
    	try {
		    SAXBuilder xmlBuilder = new SAXBuilder();
		    Reader in = new StringReader(xml);
		    Document oDoc = xmlBuilder.build(in);
		    Element root = oDoc.getRootElement();
		    Cliente oCliente = manager.find(Cliente.class,root.getAttribute(TagsXML.ID_CLIENTE).getValue());
		    System.out.println("cliente nulo? " + oCliente != null);
			oSolCom.setCliente(oCliente);
			oCliente.agregarSolicitudCompra(oSolCom);
			List<Element> items = root.getChildren(); 
			for(Element oElem : items){
				ItemSolicitudCompra oItem = new ItemSolicitudCompra();
				oItem.setRodamiento(manager.find(Rodamiento.class, oElem.getChild(TagsXML.ID_RODAMIENTO).getTextTrim()));
				oItem.setCantidad(Integer.valueOf(oElem.getChild(TagsXML.CANTIDAD).getTextTrim()));
				oSolCom.addItem(oItem);
			}
		} catch (JDOMException je) {
		    je.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return oSolCom;
    }
    
    private String getXMLOrdenCompra(SolicitudCompra oSolCom){
    	Element root = new Element(TagsXML.SOLICITUD_COMPRA);
		root.setAttribute(TagsXML.ID_SOLICITUD_COMPRA,String.valueOf(oSolCom.getIdSolCom()));
		root.setAttribute(TagsXML.ID_CLIENTE,String.valueOf(oSolCom.getCliente().getCuit()));

		for (ItemSolicitudCompra oItemSolCom : oSolCom.getItems()) {
			Element item = new Element(TagsXML.ITEM_COMPRA);
			Element idRod = new Element(TagsXML.ID_RODAMIENTO);
			idRod.setText(String.valueOf(oItemSolCom.getRodamiento().getIdRodamiento()));
			item.addContent(idRod);
			Element cantidad = new Element(TagsXML.CANTIDAD);
			cantidad.setText(String.valueOf(oItemSolCom.getCantidad()));
			item.addContent(cantidad);
			root.addContent(item);
		}

		Document oDoc = new Document();
		oDoc.addContent(root);
		XMLOutputter xml = new XMLOutputter();
		System.out.println(xml.outputString(oDoc));
		return xml.outputString(oDoc);
    }
    
    private void comprarRodamientos(String xmlOrdenCompra){
		/*try {
			InitialContext ctx = NamingUtil.getInitialContext();
			QueueConnectionFactory oFactory = (QueueConnectionFactory) ctx.lookup("ConnectionFactory");
			Queue queue = (Queue) ctx.lookup("queue/primerQueue2");
			QueueConnection qConnection = oFactory.createQueueConnection();
			QueueSession qSession = qConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
			QueueSender qSender = qSession.createSender(queue);
			TextMessage message = qSession.createTextMessage(xmlOrdenCompra);
			qSender.send(message);
		} catch (Exception e) {
			System.out.println("Error al enviar la solicitud de compra a la casa central " + e.getStackTrace());
		}*/
    }

	@Override
	public void ejbRemove() throws EJBException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void setMessageDrivenContext(MessageDrivenContext arg0)
			throws EJBException {
		// TODO Auto-generated method stub
		
	}
}
